# -*- coding:utf-8 -*-
from controller.hypervisor_manager import HypervisorManager
import libvirt
import sys


conn_kvm = libvirt.open('qemu:///system')
if conn_kvm == None:
    print('Failed to open connection to the hypervisor')
    sys.exit(1)

conn_vmware = libvirt.open('vmwarews:///session')
if conn_vmware == None:
    print('Failed to open connection to the hypervisor')
    sys.exit(1)

def helpInfo():
    print(' ')
    print('输入以下命令执行操作:\n'
           'list\n'
           '注释：list命令会打印出所有虚拟机，包括关机及开机的。list后不需要跟参数\n'
           'new\n'
           '注释：new（新建虚拟机）命令后跟四个参数，参数间以一个空格分隔。\n'
           '参数含义分别为：\n'
           '参数一，镜像路径；参数二，虚拟机名称；参数三，cpu个数（不大于物理机CPU个数）；参数四，内存数（不大于物理机内存数）\n'
           'delete\n'
           '注释：delete（删除虚拟机）命令后跟两个参数，以空格分割。\n'
           '参数含义为：\n'
           '参数一：所要删除的虚拟机名称，名称可通过list命令获取\n'
           '参数二：是否删除镜像（true，删除镜像；false，不删除镜像）。\n'
           'start\n'
           '注释：start（启动虚拟机）命令后跟一个参数，以空格分割。\n'
           '参数含义为：所要启动的虚拟机名称，名称可以通过list命令获取\n'
           'shutdown\n'
           '注释：shutdown（关机）命令后跟一个参数，以空格分割。\n'
           '参数含义为：所要关掉的虚拟机名称，名称可以通过list命令获取\n'
           'pause\n'
           '注释：pause（暂停虚拟机）命令后跟一个参数，以空格分割。\n'
           '参数含义为：所要暂停的虚拟机名称，名称可以通过list命令获取\n'
           'resume\n'
           '注释：resume（恢复虚拟机）命令后跟一个参数，以空格分割。\n'
           '参数含义为：所要恢复的虚拟机名称，名称可以通过list命令获取\n'
           'getDetailInfo\n'
           '注释：getDetailInfo（获取某个虚拟机详细信息）命令后跟一个参数，以空格分割。\n'
           '参数含义为：所要恢复的虚拟机名称，名称可以通过list命令获取\n'
           'help\n'
           '注释：help（获取帮助信息）命令后不跟参数\n'
           'quit\n'
           '注释：quit（退出测试程序）命令后不跟参数')

helpInfo()
hyper = HypervisorManager()


def main():
    print ('')
    content = input("input command:")
    print ('')
    if content.startswith('new'):
        try:
            if content.__contains__(' '):
                if len(content.split()) != 5:
                    print('传入参数不合法(个数不足或超限)，传参规则详见help命令。请重新输入')
                else:
                    hyper.new(content.split()[1], content.split()[2], content.split()[3], content.split()[4])
                    print('OK! 虚拟机创建成功')
            else:
                print ('ERROR! 传参不合法（未传入参数），传参规则详见help命令。请重新输入')
            main()
        except:
            print ('ERROR! 虚拟机创建失败(内部错误)')
            hyper.close_conn()
    elif content.startswith('delete'):
        try:
            if content.__contains__(' '):
                if len(content.split()) != 3:
                    print ('传入参数不合法(个数不足或超限)，传参规则详见help命令。请重新输入')
                elif hyper.check_defined_list(content.split()[1]):
                    hyper.delete(content.split()[1], content.split()[2])
                    print ('OK! 虚拟机删除成功')
                else:
                    print ('ERROR! 传参不合法（名称有误，只能删除处于关闭状态的虚拟机，使用list命令查看。）请重新输入...')
            else:
                print ('ERROR! 传参不合法（未传入参数），传参规则详见help命令。请重新输入...')
            main()
        except:
            print ('ERROR! 虚拟机删除失败（内部错误）')
            hyper.close_conn()
    elif content.startswith('start'):
        try:
            if content.__contains__(' '):
                if len(content.split()) != 2:
                    print ('传入参数不合法(个数不足或超限)，传参规则详见help命令。请重新输入')
                elif hyper.check_defined_list(content.split()[1]):
                    hyper.start(content.split()[1])
                    print ('OK! 虚拟机启动成功')
                else:
                    print ('ERROR! 传参不合法（名称有误，只能启动处于关闭状态的虚拟机，使用list命令查看名称。）请重新输入...')
            else:
                print ('ERROR! 传参不合法（未传入参数），传参规则详见help命令。请重新输入...')
            main()
        except:
            print ('ERROR! 虚拟机启动失败（内部错误）')
            hyper.close_conn()
    elif content.startswith('shutdown'):
        try:
            if content.__contains__(' '):
                if len(content.split()) != 2:
                    print ('传入参数不合法(个数不足或超限)，传参规则详见help命令。请重新输入')
                elif hyper.check_started_list(content.split()[1]):
                    hyper.shutdown(content.split()[1])
                    print ('OK! 虚拟机关机成功')
                else:
                    print ('ERROR! 传参不合法（名称有误，只能关闭处于启动状态的虚拟机，使用list命令查看名称。)请重新输入...')
            else:
                print ('ERROR! 传参不合法（未传入参数），传参规则详见help命令。请重新输入...')
            main()
        except:
            print ('ERROR! 虚拟机关机失败')
            hyper.close_conn()
    elif content.startswith('pause'):
        try:
            if content.__contains__(' '):
                if len(content.split()) != 2:
                    print ('传入参数不合法(个数不足或超限)，传参规则详见help命令。请重新输入')
                elif hyper.check_started_list(content.split()[1]):
                    hyper.pause(content.split()[1])
                    print ('OK! 虚拟机暂停成功')
                else:
                    print ('ERROR! 传参不合法（名称有误，只能暂停非关闭状态的虚拟机，使用list命令查看名称。）请重新输入...')
            else:
                print ('ERROR! 传参不合法（未传入参数），传参规则详见help命令。请重新输入...')
            main()
        except:
            print ('ERROR! 虚拟机暂停失败')
            hyper.close_conn()
    elif content.startswith('resume'):
        try:
            if content.__contains__(' '):
                if len(content.split()) != 2:
                    print ('传入参数不合法(个数不足或超限)，传参规则详见help命令。请重新输入')
                elif hyper.check_started_list(content.split()[1]):
                    hyper.resume(content.split()[1])
                    print ('OK! 虚拟机恢复成功')
                else:
                    print ('ERROR! 传参不合法（名称有误，只能恢复非关闭状态下的虚拟机，使用list命令查看名称。）请重新输入...')
            else:
                print ('ERROR! 传参不合法（未传入参数），传参规则详见help命令。请重新输入...')
            main()
        except:
            print ('ERROR! 虚拟机恢复失败')
            hyper.close_conn()
    elif content.startswith('list'):
        if len(content.split()) != 1:
            print ('传入参数不合法(个数不足或超限)，传参规则详见help命令。请重新输入')
        else:
            hyper.list()
        main()
    elif content.startswith('getDetailInfo'):
        if content.__contains__(' '):
            if len(content.split()) != 2:
                print ('传入参数不合法(个数不足或超限)，传参规则详见help命令。请重新输入')
            elif hyper.check_started_list(content.split()[1]):
                print ('Name = ', hyper.get_detail_info(content.split()[1]).name)
                print ('Running State = ', hyper.get_detail_info(content.split()[1]).running_state)  # 其中，started状态为1，paused状态为3
                print ('Max Memory = ', hyper.get_detail_info(content.split()[1]).max_memory)
                print ('Memory = ', hyper.get_detail_info(content.split()[1]).memory)
                print ('Number of virt CPUs = ', hyper.get_detail_info(content.split()[1]).number_CPU)
                print ('CPU Time (in s) = ', hyper.get_detail_info(content.split()[1]).CPU_time)
            elif hyper.check_defined_list(content.split()[1]):
                print ('Number of virt CPUs = %s' % hyper.get_shutdown_detail_info(content.split()[1]).cpu)
                print ('Max Memory = %s' % hyper.get_shutdown_detail_info(content.split()[1]).memory)
            else:
                print ('传入参数不合法（未有该名称的虚拟机）')
        else:
            print ('ERROR! 传参不合法（未传入参数），传参规则详见help命令。请重新输入...')
        main()
    elif content.startswith('help'):
        helpInfo()
        main()
    elif content.startswith('quit'):
        hyper.close_conn()
    else:
        print ('invalid input, please input again')
        main()


main()

